- Revision
- 788
- Author
- mauro
- Date
- 2008-08-27 09:44:50 -0500 (Wed, 27 Aug 2008)
Log Message
WAFFLE-92: Added support for registrar-driven navigation menus.
Modified Paths
- trunk/examples/freemarker-example/src/main/java/org/codehaus/waffle/example/freemarker/FreemarkerRegistrar.java
- trunk/examples/freemarker-example/src/main/java/org/codehaus/waffle/example/freemarker/controller/PersonController.java
- trunk/examples/freemarker-example/src/main/webapp/WEB-INF/web.xml
- trunk/examples/freemarker-example/src/main/webapp/layout.ftl
- trunk/examples/freemarker-example/src/main/webapp/navigation.ftl
- trunk/examples/freemarker-example/src/main/webapp/people/manage.ftl
Added Paths
- trunk/examples/freemarker-example/src/main/webapp/home.ftl
- trunk/examples/freemarker-example/src/main/webapp/index.jsp
- trunk/waffle-core/src/main/java/org/codehaus/waffle/menu/
- trunk/waffle-core/src/main/java/org/codehaus/waffle/menu/Menu.java
- trunk/waffle-core/src/main/java/org/codehaus/waffle/menu/MenuAware.java
- trunk/waffle-core/src/main/java/org/codehaus/waffle/menu/MenuAwareController.java
- trunk/waffle-core/src/test/java/org/codehaus/waffle/menu/
- trunk/waffle-core/src/test/java/org/codehaus/waffle/menu/MenuTest.java
Removed Paths
Diff
Modified: trunk/examples/freemarker-example/src/main/java/org/codehaus/waffle/example/freemarker/FreemarkerRegistrar.java (787 => 788)
--- trunk/examples/freemarker-example/src/main/java/org/codehaus/waffle/example/freemarker/FreemarkerRegistrar.java 2008-08-26 14:45:49 UTC (rev 787) +++ trunk/examples/freemarker-example/src/main/java/org/codehaus/waffle/example/freemarker/FreemarkerRegistrar.java 2008-08-27 14:44:50 UTC (rev 788) @@ -1,8 +1,12 @@ package org.codehaus.waffle.example.freemarker; +import static java.util.Arrays.asList; import static org.codehaus.waffle.bind.converters.DateValueConverter.DAY_FORMAT_KEY; import static org.codehaus.waffle.bind.converters.DateValueConverter.TIME_FORMAT_KEY; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.Properties; import org.codehaus.waffle.ComponentRegistry; @@ -15,6 +19,8 @@ import org.codehaus.waffle.example.freemarker.converters.PersonListValueConverter; import org.codehaus.waffle.example.freemarker.converters.PersonValueConverter; import org.codehaus.waffle.example.freemarker.persister.SimplePersonPersister; +import org.codehaus.waffle.menu.Menu; +import org.codehaus.waffle.menu.MenuAwareController; import org.codehaus.waffle.registrar.AbstractRegistrar; import org.codehaus.waffle.registrar.Registrar; @@ -43,6 +49,14 @@ finder.registerConverter((ValueConverter) getRegistered(PersonValueConverter.class)); finder.registerConverter((ValueConverter) getRegistered(PersonListValueConverter.class)); register("people/manage", PersonController.class); + register("home", MenuAwareController.class); + registerInstance(createMenu()); } + private Menu createMenu() { + Map<String, List<String>> content = new HashMap<String, List<String>>(); + content.put("Home", asList("Home:home")); + content.put("People", asList("Manage:people/manage")); + return new Menu(content); + } }
Modified: trunk/examples/freemarker-example/src/main/java/org/codehaus/waffle/example/freemarker/controller/PersonController.java (787 => 788)
--- trunk/examples/freemarker-example/src/main/java/org/codehaus/waffle/example/freemarker/controller/PersonController.java 2008-08-26 14:45:49 UTC (rev 787) +++ trunk/examples/freemarker-example/src/main/java/org/codehaus/waffle/example/freemarker/controller/PersonController.java 2008-08-27 14:44:50 UTC (rev 788) @@ -13,11 +13,13 @@ import org.codehaus.waffle.example.freemarker.model.Person.Type; import org.codehaus.waffle.example.freemarker.persister.PersistablePerson; import org.codehaus.waffle.example.freemarker.persister.PersonPersister; +import org.codehaus.waffle.menu.Menu; +import org.codehaus.waffle.menu.MenuAwareController; import org.codehaus.waffle.view.ExportView; import org.codehaus.waffle.view.View; @SuppressWarnings("serial") -public class PersonController implements Serializable { +public class PersonController extends MenuAwareController implements Serializable { private final PersonPersister persister; private final DateProvider dateProvider; private Person person; @@ -25,7 +27,8 @@ private List<String> skills = Arrays.asList("Magician", "Apprentice"); private Long id; - public PersonController(PersonPersister persister, DateProvider dateProvider) { + public PersonController(Menu menu, PersonPersister persister, DateProvider dateProvider) { + super(menu); this.persister = persister; this.dateProvider = dateProvider; }
Modified: trunk/examples/freemarker-example/src/main/webapp/WEB-INF/web.xml (787 => 788)
--- trunk/examples/freemarker-example/src/main/webapp/WEB-INF/web.xml 2008-08-26 14:45:49 UTC (rev 787) +++ trunk/examples/freemarker-example/src/main/webapp/WEB-INF/web.xml 2008-08-27 14:44:50 UTC (rev 788) @@ -91,7 +91,7 @@ <!-- Welcome files --> <welcome-file-list> - <welcome-file>index.ftl</welcome-file> + <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- Security -->
Added: trunk/examples/freemarker-example/src/main/webapp/home.ftl (0 => 788)
--- trunk/examples/freemarker-example/src/main/webapp/home.ftl (rev 0) +++ trunk/examples/freemarker-example/src/main/webapp/home.ftl 2008-08-27 14:44:50 UTC (rev 788) @@ -0,0 +1,14 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html4/loose.dtd"> +<html> +<head> + <title>Waffle: FreeMarker example</title> +</head> +<body> + <#include "/navigation.ftl" parse="true"> + <div id="content"> + <h1>Waffle example with Freemarker</h1> + <p>Welcome to the Waffle Freemarker/Sitemesh example. Choose an action from the navigation menu.</p> + </div> +</body> +</html> \ No newline at end of file
Deleted: trunk/examples/freemarker-example/src/main/webapp/index.ftl (787 => 788)
--- trunk/examples/freemarker-example/src/main/webapp/index.ftl 2008-08-26 14:45:49 UTC (rev 787) +++ trunk/examples/freemarker-example/src/main/webapp/index.ftl 2008-08-27 14:44:50 UTC (rev 788) @@ -1,11 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" - "http://www.w3.org/TR/html4/loose.dtd"> -<html> -<head> - <title>Waffle: FreeMarker example</title> -</head> -<body> - <h1>Waffle example with Freemarker</h1> - <p>Welcome to the Waffle Freemarker/Sitemesh example. Choose an action from the navigation</p> -</body> -</html> \ No newline at end of file
Copied: trunk/examples/freemarker-example/src/main/webapp/index.jsp (from rev 787, trunk/examples/freemarker-example/src/main/webapp/index.ftl) (0 => 788)
--- trunk/examples/freemarker-example/src/main/webapp/index.jsp (rev 0) +++ trunk/examples/freemarker-example/src/main/webapp/index.jsp 2008-08-27 14:44:50 UTC (rev 788) @@ -0,0 +1,3 @@ +<jsp:root xmlns="http://www.w3.org/1999/xhtml" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:c="http://java.sun.com/jsp/jstl/core" version="2.0"> +<c:redirect url="" +</jsp:root> \ No newline at end of file
Property changes: trunk/examples/freemarker-example/src/main/webapp/index.jsp
Name: svn:mergeinfo
+
Modified: trunk/examples/freemarker-example/src/main/webapp/layout.ftl (787 => 788)
--- trunk/examples/freemarker-example/src/main/webapp/layout.ftl 2008-08-26 14:45:49 UTC (rev 787) +++ trunk/examples/freemarker-example/src/main/webapp/layout.ftl 2008-08-27 14:44:50 UTC (rev 788) @@ -9,8 +9,6 @@ <body> <#include "/header.ftl" parse="true"> <hr/> - <#include "/navigation.ftl" parse="true"> - <hr/> ${body} <hr/> <#include "/footer.ftl" parse="true">
Modified: trunk/examples/freemarker-example/src/main/webapp/navigation.ftl (787 => 788)
--- trunk/examples/freemarker-example/src/main/webapp/navigation.ftl 2008-08-26 14:45:49 UTC (rev 787) +++ trunk/examples/freemarker-example/src/main/webapp/navigation.ftl 2008-08-27 14:44:50 UTC (rev 788) @@ -1,3 +1,16 @@ <div id="navigation"> -[Navigation] <a href="" Maintenance</a> + <#if controller.menu??> + <div id="menu"> + <#assign menu=controller.getMenu()> + <#list menu.groups as group> + <div class="menu-group menu-entry"><a>${group.title}</a> + <div id="menu-group-content${group_index}" class="menu-group-content"> + <#list group.entries as entry> + <div class="menu-entry"><a href="" + </#list> + </div> + </div> + </#list> + </div> + </#if> </div> \ No newline at end of file
Modified: trunk/examples/freemarker-example/src/main/webapp/people/manage.ftl (787 => 788)
--- trunk/examples/freemarker-example/src/main/webapp/people/manage.ftl 2008-08-26 14:45:49 UTC (rev 787) +++ trunk/examples/freemarker-example/src/main/webapp/people/manage.ftl 2008-08-27 14:44:50 UTC (rev 788) @@ -5,6 +5,8 @@ <title>Select a person</title> </head> <body> +<#include "/navigation.ftl" parse="true"> +<div id="content"> <form action="" method="post"> <h3>Waffle example: Select Person</h3> @@ -57,6 +59,7 @@ </div> </form> +</div> </body> </html> \ No newline at end of file
Added: trunk/waffle-core/src/main/java/org/codehaus/waffle/menu/Menu.java (0 => 788)
--- trunk/waffle-core/src/main/java/org/codehaus/waffle/menu/Menu.java (rev 0) +++ trunk/waffle-core/src/main/java/org/codehaus/waffle/menu/Menu.java 2008-08-27 14:44:50 UTC (rev 788) @@ -0,0 +1,95 @@ +/* + * Copyright (c) terms as published in http://waffle.codehaus.org/license.html + */ +package org.codehaus.waffle.menu; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * Represents the menu holding the navigation model. Menus entries are divided into groups. + * Content can be provided as a map, keyed on group title, of lists of entries where each entry + * is a colon-separated string "title:path". + * + * @author Mauro Talevi + */ +public class Menu { + + private static final String COLON = ":"; + private List<Group> groups; + + public Menu() { + this(new ArrayList<Group>()); + } + + public Menu(List<Group> groups) { + this.groups = groups; + } + + public Menu(Map<String, List<String>> content) { + this(toGroups(content)); + } + + private static List<Group> toGroups(Map<String, List<String>> content) { + List<Group> groups = new ArrayList<Group>(); + for (String title : content.keySet()) { + groups.add(new Group(title, toEntries(content.get(title)))); + } + return groups; + } + + private static List<Entry> toEntries(List<String> content) { + List<Entry> entries = new ArrayList<Entry>(); + for (String entry : content) { + String[] split = entry.split(COLON); + if (split.length > 1) { + entries.add(new Entry(split[0], split[1])); + } + } + return entries; + } + + public List<Group> getGroups() { + return groups; + } + + public static class Group { + private String title; + private List<Entry> entries; + + public Group(String title, List<Entry> entries) { + this.title = title; + this.entries = entries; + } + + public String getTitle() { + return title; + } + + public List<Entry> getEntries() { + return entries; + } + + } + + public static class Entry { + + private String title; + private String path; + + public Entry(String title, String path) { + this.title = title; + this.path = path; + } + + public String getTitle() { + return title; + } + + public String getPath() { + return path; + } + + } +}
Added: trunk/waffle-core/src/main/java/org/codehaus/waffle/menu/MenuAware.java (0 => 788)
--- trunk/waffle-core/src/main/java/org/codehaus/waffle/menu/MenuAware.java (rev 0) +++ trunk/waffle-core/src/main/java/org/codehaus/waffle/menu/MenuAware.java 2008-08-27 14:44:50 UTC (rev 788) @@ -0,0 +1,15 @@ +/* + * Copyright (c) terms as published in http://waffle.codehaus.org/license.html + */ +package org.codehaus.waffle.menu; + +/** + * Implemented by any controller that requires a menu + * + * @author Mauro Talevi + */ +public interface MenuAware { + + Menu getMenu(); + +}
Added: trunk/waffle-core/src/main/java/org/codehaus/waffle/menu/MenuAwareController.java (0 => 788)
--- trunk/waffle-core/src/main/java/org/codehaus/waffle/menu/MenuAwareController.java (rev 0) +++ trunk/waffle-core/src/main/java/org/codehaus/waffle/menu/MenuAwareController.java 2008-08-27 14:44:50 UTC (rev 788) @@ -0,0 +1,23 @@ +/* + * Copyright (c) terms as published in http://waffle.codehaus.org/license.html + */ +package org.codehaus.waffle.menu; + +/** + * Menu-aware controller that can be used as base class. + * + * @author Mauro Talevi + */ +public class MenuAwareController implements MenuAware { + + private Menu menu; + + public MenuAwareController(Menu menu) { + this.menu = menu; + } + + public Menu getMenu() { + return menu; + } + +}
Added: trunk/waffle-core/src/test/java/org/codehaus/waffle/menu/MenuTest.java (0 => 788)
--- trunk/waffle-core/src/test/java/org/codehaus/waffle/menu/MenuTest.java (rev 0) +++ trunk/waffle-core/src/test/java/org/codehaus/waffle/menu/MenuTest.java 2008-08-27 14:44:50 UTC (rev 788) @@ -0,0 +1,48 @@ +package org.codehaus.waffle.menu; + +import static java.util.Arrays.asList; +import static org.junit.Assert.assertEquals; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.codehaus.waffle.menu.Menu.Entry; +import org.codehaus.waffle.menu.Menu.Group; +import org.junit.Test; + +/** + * @author Mauro Talevi + */ +public class MenuTest { + + @Test + public void canCreateMenu() { + Map<String, List<String>> content = new HashMap<String, List<String>>(); + content.put("Group1", asList("entry11:path11", "entry12:path12")); + content.put("Group2", asList("entry21:path21", "entry22:path22")); + Menu menu = new Menu(content); + List<Group> groups = menu.getGroups(); + assertEquals(2, groups.size()); + assertEquals("Group1", groups.get(0).getTitle()); + assertEquals("Group2", groups.get(1).getTitle()); + List<Entry> entries1 = groups.get(0).getEntries(); + assertEquals("entry11", entries1.get(0).getTitle()); + assertEquals("entry12", entries1.get(1).getTitle()); + assertEquals("path11", entries1.get(0).getPath()); + assertEquals("path12", entries1.get(1).getPath()); + List<Entry> entries2 = groups.get(1).getEntries(); + assertEquals("entry21", entries2.get(0).getTitle()); + assertEquals("entry22", entries2.get(1).getTitle()); + assertEquals("path21", entries2.get(0).getPath()); + assertEquals("path22", entries2.get(1).getPath()); + } + + @Test + public void canCreateMenuAwareController() { + Menu menu = new Menu(); + MenuAwareController controller = new MenuAwareController(menu); + assertEquals(menu, controller.getMenu()); + } + +}
To unsubscribe from this list please visit: